/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package commonlib.domain;

/**
 * Aquesta classe implementa un Parell de alpha i beta que es pot comparar
 * @author genis.sole
 */
public class ABPair implements Comparable {

    private String alpha;
    private String beta;

    /**
     * Crea una ABPair amb alpha = alpha i beta = beta
     * @param alpha
     * @param beta
     */
    public ABPair(String alpha, String beta) {
        this.alpha = alpha;
        this.beta = beta;
    }

    /**
     * Obte l'atribut beta del ABPair referenciat
     * @return l'atribut alpha del ABPair referenciat
     */
    public String getAlpha() {
        return alpha;
    }

    /**
     * Obte l'atribut beta del ABPair referenciat
     * @return l'atribut beta del ABPair referenciat
     */
    public String getBeta() {
        return beta;
    }

    /**
     * El valor del l'atribut alpha del ABPair referenciat passa a valer alpha
     * @param alpha
     */
    public void setAlpha(String alpha) {
        this.alpha = alpha;
    }

    /**
     * El valor de l'atribut beta del ABPair referenciat passa a veler beta
     * @param beta
     */
    public void setBeta(String beta) {
        this.beta = beta;
    }
    /**
     * Calcula el codi hash del ABPair referenciat
     * @return el codi hash del ABPair referenciat
     */
    @Override
    public int hashCode() {
        return alpha.hashCode() * alpha.length()
               + beta.hashCode() * beta.length();
    }

    /**
     * Compara la igualtat de qualsevol objecte amb el ABPair referenciat
     * @param obj qualsevol objecte
     * @return true si el ABPair referenciat es igual a obj false altrament
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ABPair other = (ABPair) obj;
        if ((this.alpha == null) ? (other.alpha != null)
                                 : !this.alpha.equals(other.alpha)) {
            return false;
        }
        if ((this.beta == null) ? (other.beta != null)
                                : !this.beta.equals(other.beta)) {
            return false;
        }
        return true;
    }

    /**
     * Compara el ABPair referenciat amb un objecte qualsevol
     * @param obj
     * @return retorna 0 si son lexicograficament igulas, un enter positiu si el
     * ABPair referenciat es mes gran i un entre negatiu altrament
     * @throws ClassCastException si obj no es de la classe ABPair
     */
    public int compareTo(Object obj) throws ClassCastException {
        if (getClass() != obj.getClass()) {
            throw new ClassCastException();
        }

        int compAlpha = alpha.compareTo(((ABPair) obj).getAlpha());
        if (compAlpha != 0) {
            return compAlpha;
        } else {
            return beta.compareTo(((ABPair) obj).getBeta());
        }
    }

    @Override
    public String toString() {
        return "[" + alpha + ", " + beta +"]";
    }
}